home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 2
/
AACD 2.iso
/
AACD
/
Programming
/
fpc
/
amigaunits
/
locale.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1998-09-22
|
19KB
|
629 lines
{
This file is part of the Free Pascal run time library.
A file in Amiga system run time library.
Copyright (c) 1998 by Nils Sjoholm
member of the Amiga RTL development team.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
UNIT locale;
INTERFACE
USES exec, amigados, utility;
const
{ constants for GetLocaleStr() }
DAY_1 = 1; { Sunday }
DAY_2 = 2; { Monday }
DAY_3 = 3; { Tuesday }
DAY_4 = 4; { Wednesday }
DAY_5 = 5; { Thursday }
DAY_6 = 6; { Friday }
DAY_7 = 7; { Saturday }
ABDAY_1 = 8 ; { Sun }
ABDAY_2 = 9 ; { Mon }
ABDAY_3 = 10; { Tue }
ABDAY_4 = 11; { Wed }
ABDAY_5 = 12; { Thu }
ABDAY_6 = 13; { Fri }
ABDAY_7 = 14; { Sat }
MON_1 = 15; { January }
MON_2 = 16; { February }
MON_3 = 17; { March }
MON_4 = 18; { April }
MON_5 = 19; { May }
MON_6 = 20; { June }
MON_7 = 21; { July }
MON_8 = 22; { August }
MON_9 = 23; { September }
MON_10 = 24; { October }
MON_11 = 25; { November }
MON_12 = 26; { December }
ABMON_1 = 27; { Jan }
ABMON_2 = 28; { Feb }
ABMON_3 = 29; { Mar }
ABMON_4 = 30; { Apr }
ABMON_5 = 31; { May }
ABMON_6 = 32; { Jun }
ABMON_7 = 33; { Jul }
ABMON_8 = 34; { Aug }
ABMON_9 = 35; { Sep }
ABMON_10 = 36; { Oct }
ABMON_11 = 37; { Nov }
ABMON_12 = 38; { Dec }
YESSTR = 39; { affirmative response for yes/no queries }
NOSTR = 40; { negative response for yes/no queries }
AM_STR = 41; { AM }
PM_STR = 42; { PM }
SOFTHYPHEN = 43; { soft hyphenation }
HARDHYPHEN = 44; { hard hyphenation }
OPENQUOTE = 45; { start of quoted block }
CLOSEQUOTE = 46; { end of quoted block }
YESTERDAYSTR = 47; { Yesterday }
TODAYSTR = 48; { Today }
TOMORROWSTR = 49; { Tomorrow }
FUTURESTR = 50; { Future }
MAXSTRMSG = 51; { current number of defined strings }
{***************************************************************************}
Type
{ OpenLibrary("locale.library",0) returns a pointer to this structure }
pLocaleBase = ^tLocaleBase;
tLocaleBase = record
lb_LibNode : tLibrary;
lb_SysPatches : Boolean; { TRUE if locale installed its patches }
end;
{***************************************************************************}
Type
{ This structure must only be allocated by locale.library and is READ-ONLY! }
pLocale = ^tLocale;
tLocale = record
loc_LocaleName, { locale's name }
loc_LanguageName : STRPTR; { language of this locale }
loc_PrefLanguages : Array[0..9] of STRPTR; { preferred languages }
loc_Flags : ULONG; { always 0 for now }
loc_CodeSet, { always 0 for now }
loc_CountryCode, { user's country code }
loc_TelephoneCode, { country's telephone code }
loc_GMTOffset : ULONG; { minutes from GMT }
loc_MeasuringSystem, { what measuring system? }
loc_CalendarType : Byte; { what calendar type? }
loc_Reserved0 : Array[0..1] of Byte;
loc_DateTimeFormat, { regular date & time format }
loc_DateFormat, { date format by itself }
loc_TimeFormat, { time format by itself }
loc_ShortDateTimeFormat, { short date & time format }
loc_ShortDateFormat, { short date format by itself }
loc_ShortTimeFormat, { short time format by itself }
{ for numeric values }
loc_DecimalPoint, { character before the decimals }
loc_GroupSeparator, { separates groups of digits }
loc_FracGroupSeparator : STRPTR; { separates groups of digits }
loc_Grouping, { size of each group }
loc_FracGrouping : Pointer; { size of each group }
{ for monetary values }
loc_MonDecimalPoint,
loc_MonGroupSeparator,
loc_MonFracGroupSeparator : STRPTR;
loc_MonGrouping,
loc_MonFracGrouping : Pointer;
loc_MonFracDigits, { digits after the decimal point }
loc_MonIntFracDigits : Byte; { for international representation }
loc_Reserved1 : Array[0..1] of Byte;
{ for currency symbols }
loc_MonCS, { currency symbol }
loc_MonSmallCS, { symbol for small amounts }
loc_MonIntCS : STRPTR; { internationl (ISO 4217) code }
{ for positive monetary values }
loc_MonPositiveSign : STRPTR; { indicate positive money value }
loc_MonPositiveSpaceSep, { determine if separated by space }
loc_MonPositiveSignPos, { position of positive sign }
loc_MonPositiveCSPos, { position of currency symbol }
loc_Reserved2 : Byte;
{ for negative monetary values }
loc_MonNegativeSign : STRPTR; { indicate negative money value }
loc_MonNegativeSpaceSep, { determine if separated by space }
loc_MonNegativeSignPos, { position of negative sign }
loc_MonNegativeCSPos, { position of currency symbol }
loc_Reserved3 : Byte;
end;
const
{ constants for Locale.loc_MeasuringSystem }
MS_ISO = 0; { international metric system }
MS_AMERICAN = 1; { american system }
MS_IMPERIAL = 2; { imperial system }
MS_BRITISH = 3; { british system }
{ constants for Locale.loc_CalendarType }
CT_7SUN = 0; { 7 days a week, Sunday is the first day }
CT_7MON = 1; { 7 days a week, Monday is the first day }
CT_7TUE = 2; { 7 days a week, Tuesday is the first day }
CT_7WED = 3; { 7 days a week, Wednesday is the first day }
CT_7THU = 4; { 7 days a week, Thursday is the first day }
CT_7FRI = 5; { 7 days a week, Friday is the first day }
CT_7SAT = 6; { 7 days a week, Saturday is the first day }
{ constants for Locale.loc_MonPositiveSpaceSep and Locale.loc_MonNegativeSpaceSep }
SS_NOSPACE = 0; { cur. symbol is NOT separated from value with a space }
SS_SPACE = 1; { cur. symbol IS separated from value with a space }
{ constants for Locale.loc_MonPositiveSignPos and Locale.loc_MonNegativeSignPos }
SP_PARENS = 0; { () surround the quantity and currency_symbol }
SP_PREC_ALL = 1; { sign string comes before amount and symbol }
SP_SUCC_ALL = 2; { sign string comes after amount and symbol }
SP_PREC_CURR = 3; { sign string comes right before currency symbol }
SP_SUCC_CURR = 4; { sign string comes right after currency symbol }
{ constants for Locale.loc_MonPositiveCSPos and Locale.loc_MonNegativeCSPos }
CSP_PRECEDES = 0; { currency symbol comes before value }
CSP_SUCCEEDS = 1; { currency symbol comes after value }
{ elements of the byte arrays pointed to by:
* Locale.loc_Grouping
* Locale.loc_FracGrouping
* Locale.loc_MonGrouping
* Locale.loc_MonFracGrouping
* are interpreted as follows:
*
* 255 indicates that no further grouping is to be performed
* 0 indicates that the previous element is to be repeatedly used
* for the remainder of the digits
* <other> the number of digits that comprises the current group
}
{***************************************************************************}
{ Tags for OpenCatalog() }
OC_TagBase = (TAG_USER + $90000);
OC_BuiltInLanguage = OC_TagBase+1; { language of built-in strings }
OC_BuiltInCodeSet = OC_TagBase+2; { code set of built-in strings }
OC_Version = OC_TagBase+3; { catalog version number required }
OC_Language = OC_TagBase+4; { preferred language of catalog }
{***************************************************************************}
{ Comparison types for StrnCmp() }
SC_ASCII = 0;
SC_COLLATE1 = 1;
SC_COLLATE2 = 2;
{***************************************************************************}
Type
{ This structure must only be allocated by locale.library and is READ-ONLY! }
pCatalog = ^tCatalog;
tCatalog = record
cat_Link : tNode; { for internal linkage }
cat_Pad : WORD; { to longword align }
cat_Language: STRPTR; { language of the catalog }
cat_CodeSet : ULONG; { currently always 0 }
cat_Version : WORD; { version of the catalog }
cat_Revision: WORD; { revision of the catalog }
end;
{***************************************************************************}
{ --- functions in V38 or higher (Release 2.1) --- }
VAR LocaleBase : pLocaleBase;
PROCEDURE CloseCatalog(catalog : pCatalog);
PROCEDURE CloseLocale(locale : pLocale);
FUNCTION ConvToLower(locale : pLocale; character : ULONG) : ULONG;
FUNCTION ConvToUpper(locale : pLocale; character : ULONG) : ULONG;
PROCEDURE FormatDate(locale : pLocale; fmtTemplate : pCHAR; date : pDateStamp; putCharFunc : pHook);
FUNCTION FormatString(locale : pLocale; fmtTemplate : pCHAR; dataStream : POINTER; putCharFunc : pHook) : POINTER;
FUNCTION GetCatalogStr(catalog : pCatalog; stringNum : LONGINT; defaultString : pCHAR) : pCHAR;
FUNCTION GetLocaleStr(locale : pLocale; stringNum : ULONG) : pCHAR;
FUNCTION IsAlNum(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsAlpha(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsCntrl(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsDigit(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsGraph(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsLower(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsPrint(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsPunct(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsSpace(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsUpper(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION IsXDigit(locale : pLocale; character : ULONG) : BOOLEAN;
FUNCTION OpenCatalogA(locale : pLocale; name : pCHAR; tags : pTagItem) : pCatalog;
FUNCTION OpenLocale(name : pCHAR) : pLocale;
FUNCTION ParseDate(locale : pLocale; date : pDateStamp; fmtTemplate : pCHAR; getCharFunc : pHook) : BOOLEAN;
FUNCTION StrConvert(locale : pLocale; string1 : pCHAR; buffer : POINTER; bufferSize : ULONG; typ : ULONG) : ULONG;
FUNCTION StrnCmp(locale : pLocale; string1 : pCHAR; string2 : pCHAR; length : LONGINT; typ : ULONG) : LONGINT;
IMPLEMENTATION
PROCEDURE CloseCatalog(catalog : pCatalog);
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L catalog,A0
MOVEA.L LocaleBase,A6
JSR -036(A6)
MOVEA.L (A7)+,A6
END;
END;
PROCEDURE CloseLocale(locale : pLocale);
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L LocaleBase,A6
JSR -042(A6)
MOVEA.L (A7)+,A6
END;
END;
FUNCTION ConvToLower(locale : pLocale; character : ULONG) : ULONG;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -048(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION ConvToUpper(locale : pLocale; character : ULONG) : ULONG;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -054(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
PROCEDURE FormatDate(locale : pLocale; fmtTemplate : pCHAR; date : pDateStamp; putCharFunc : pHook);
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L fmtTemplate,A1
MOVEA.L date,A2
MOVEA.L putCharFunc,A3
MOVEA.L LocaleBase,A6
JSR -060(A6)
MOVEA.L (A7)+,A6
END;
END;
FUNCTION FormatString(locale : pLocale; fmtTemplate : pCHAR; dataStream : POINTER; putCharFunc : pHook) : POINTER;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L fmtTemplate,A1
MOVEA.L dataStream,A2
MOVEA.L putCharFunc,A3
MOVEA.L LocaleBase,A6
JSR -066(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION GetCatalogStr(catalog : pCatalog; stringNum : LONGINT; defaultString : pCHAR) : pCHAR;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L catalog,A0
MOVE.L stringNum,D0
MOVEA.L defaultString,A1
MOVEA.L LocaleBase,A6
JSR -072(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION GetLocaleStr(locale : pLocale; stringNum : ULONG) : pCHAR;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L stringNum,D0
MOVEA.L LocaleBase,A6
JSR -078(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION IsAlNum(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -084(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsAlpha(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -090(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsCntrl(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -096(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsDigit(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -102(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsGraph(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -108(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsLower(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -114(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsPrint(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -120(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsPunct(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -126(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsSpace(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -132(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsUpper(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -138(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION IsXDigit(locale : pLocale; character : ULONG) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVE.L character,D0
MOVEA.L LocaleBase,A6
JSR -144(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION OpenCatalogA(locale : pLocale; name : pCHAR; tags : pTagItem) : pCatalog;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L name,A1
MOVEA.L tags,A2
MOVEA.L LocaleBase,A6
JSR -150(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION OpenLocale(name : pCHAR) : pLocale;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L name,A0
MOVEA.L LocaleBase,A6
JSR -156(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION ParseDate(locale : pLocale; date : pDateStamp; fmtTemplate : pCHAR; getCharFunc : pHook) : BOOLEAN;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L date,A1
MOVEA.L fmtTemplate,A2
MOVEA.L getCharFunc,A3
MOVEA.L LocaleBase,A6
JSR -162(A6)
MOVEA.L (A7)+,A6
TST.W D0
BEQ.B @end
MOVEQ #1,D0
@end: MOVE.B D0,@RESULT
END;
END;
FUNCTION StrConvert(locale : pLocale; string1 : pCHAR; buffer : POINTER; bufferSize : ULONG; typ : ULONG) : ULONG;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L string1,A1
MOVEA.L buffer,A2
MOVE.L bufferSize,D0
MOVE.L typ,D1
MOVEA.L LocaleBase,A6
JSR -174(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
FUNCTION StrnCmp(locale : pLocale; string1 : pCHAR; string2 : pCHAR; length : LONGINT; typ : ULONG) : LONGINT;
BEGIN
ASM
MOVE.L A6,-(A7)
MOVEA.L locale,A0
MOVEA.L string1,A1
MOVEA.L string2,A2
MOVE.L length,D0
MOVE.L typ,D1
MOVEA.L LocaleBase,A6
JSR -180(A6)
MOVEA.L (A7)+,A6
MOVE.L D0,@RESULT
END;
END;
END. (* UNIT LOCALE *)